package com.o2o.config.web;

import com.google.code.kaptcha.servlet.KaptchaServlet;
import com.o2o.interceptor.shopadmin.ShopLoginInterceptor;
import com.o2o.interceptor.shopadmin.ShopPermissionInterceptor;
import com.sun.xml.internal.ws.api.FeatureListValidatorAnnotation;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import javax.servlet.ServletException;
import javax.swing.border.Border;
import java.rmi.server.ServerCloneException;

/**
 * package_name:com.o2o.config.web
 * Author:徐亚远
 * Date:2020/1/6 13:41
 * 项目名:com.o2o
 * Desription:开启Mvc自动注入spring容器,WebMvcConfigurerAdapter:置试图解析器
 **/
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware {
    //spring容器
    //@Autowired
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /*
     * 静态资源配置
     * @param registry
     * * */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/o2o-image/upload/");
    }
    /*
     * 定义默认的请求处理器
     * */

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    /*
     *创建 viewResolver
     * @return
     *  */
    @Bean(name = "viewResolver")
    public ViewResolver createViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        //设置spring容器
        viewResolver.setApplicationContext(this.applicationContext);
        //取消缓存
        viewResolver.setCache(false);
        //设置解析的前缀
        viewResolver.setPrefix("/WEB-INF/html/");
        //设置视图解析的后缀
        viewResolver.setSuffix(".html");
        return viewResolver;
    }

    /*
     * 文件上传解析器
     * @return*/
    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver createMultipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setDefaultEncoding("utf-8");
        multipartResolver.setMaxUploadSize(20971520);
        multipartResolver.setMaxInMemorySize(20971520);
        return multipartResolver;
    }

    @Value("${kaptcha.border}")
    private String border;
    @Value("${kaptcha.textproducer.font.color}")
    private String fcolor;
    @Value("${kaptcha.image.width}")
    private String width;
    @Value("${kaptcha.textproducer.char.string}")
    private String cString;
    @Value("${kaptcha.image.height}")
    private String height;
    @Value("${kaptcha.textproducer.font.size}")
    private String fsize;
    @Value("${kaptcha.noise.color}")
    private String ncolor;
    @Value("${kaptcha.textproducer.char.length}")
    private String clength;
    @Value("${kaptcha.textproducer.font.names}")
    private String fnames;

    /*
     * 由于web.xml不生效了,需要在这里配置Kapcha验证码Servlet
     * */
    @Bean
    public ServletRegistrationBean servletRegistrationBean() throws ServletException {
        ServletRegistrationBean servlet = new ServletRegistrationBean(new KaptchaServlet(), "/Kaptcha");
        servlet.addInitParameter("kaptcha.border", border);//无边框
        servlet.addInitParameter("kaptcha.textproducer.font.color", fcolor);//字体颜色
        servlet.addInitParameter("kaptcha.image.width", width);//图片宽度
        servlet.addInitParameter("kaptcha.textproducer.char.string", cString);//使用那些字
        servlet.addInitParameter("kaptcha.image.height", height);//图片高度
        servlet.addInitParameter("kaptcha.textproducer.font.size", fsize);//字体大小
        servlet.addInitParameter("kaptcha.noise.color", ncolor);//干扰线的颜色
        servlet.addInitParameter("kaptcha.textproducer.char.length", clength);//字符个数
        servlet.addInitParameter("kaptcha.textproducer.font.names", fnames);//字体
        return servlet;
    }

    /*
     * 添加拦截器
     * */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String interceptPath = "/shopAdmin/**";
        //注册拦截器
        InterceptorRegistration loginIR = registry.addInterceptor(new ShopLoginInterceptor());
        //配置拦截器
        loginIR.addPathPatterns(interceptPath);
        //还可以注册其他拦截器
        InterceptorRegistration permissonIR = registry.addInterceptor(new ShopPermissionInterceptor());
        //配置拦截器的路径
        permissonIR.addPathPatterns(interceptPath);
        //配置不拦截的路径
        //shoplist page
        permissonIR.excludePathPatterns("/shopAdmin/shoplist");
        permissonIR.excludePathPatterns("/shopAdmin/getshoplist");
        //shopregister page
        permissonIR.excludePathPatterns("/shopAdmin/getShopInitInfo");
        permissonIR.excludePathPatterns("/shopAdmin/registShop");
        permissonIR.excludePathPatterns("/shopAdmin/shopoperation");
        //shopmanage page
        permissonIR.excludePathPatterns("/shopAdmin/shopmanagment");
        permissonIR.excludePathPatterns("/shopAdmin/getshopmanagementinfo");
    }
}
